package com.aluvfy.jdbc;

import com.aluvfy.jdbc.utils.DbUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/*
* Description: 实现用户登录功能
* 这个程序在实现用户登录的同时，演示了SQL注入现象
* 导致SQL注入现象的根本原因是什么呢？
*          1. 用户输入的信息中含有SQL关键字
*          2， 用户提供信息中的关键字参与了编译
* SQL注入是一种安全隐患：攻击者通过向数据库发送恶意的sql语句，从而获取到数据库中的敏感信息
* 怎么避免SQL注入现象讷？
*           java.sql.Statement存在SQL注入现象，因为它的原理是，先进行SQL语句的拼接，然后再进行编译
*           为了避免SQL注入现象，JDBC API为Statement提供了一个子接口java.sql.PreparedStatement，被称为预编译的数据库操作对象
*           java.sql.PreparedStatement可以解决SQL注入问题：
* 具体怎么解决呢？
*           PreparedStatement可以对SQL语句先进行预编译，再给编译好的SQL语句占位符传值，通过这种方式解决SQL注入问题。
* */
public class JDBCTest08 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //初始化登录页面
        System.out.println("欢迎使用该系统！");
        System.out.println("用户：");
        String loginName = scanner.nextLine();
        System.out.println("密码：");
        String loginPwd = scanner.nextLine();

        //连接数据库 判断账户密码是否正确
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;
        boolean loginSuccess = false;
        String realName = null;

        try {
            //连接数据库
            conn = DbUtils.getConnection();
            //获取数据库对象
            stm = conn.createStatement();
            //执行sql语句
            String sql = "select * from t_user where name = '" + loginName + "' and password = '" + loginPwd + "'";
            System.out.println(sql);
            rs = stm.executeQuery(sql);
            //处理结果集，结果集中有数据则登录成功，没数据就失败
            if (rs.next()) {
                loginSuccess = true;
                realName = rs.getString("realname");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 释放资源
            DbUtils.close(conn, stm, rs);
        }

        System.out.println(loginSuccess ? "登录成功！欢迎" + realName + "！" : "登录失败！您的用户不存在或者密码错误");
    }
}
